package day11.stringdemo;

import com.google.gson.Gson;
import redis.clients.jedis.Jedis;

import java.io.*;

public class StringDemo2 {

    private static Jedis jedis = new Jedis("master", 6379);

    public static void main(String[] args) throws Exception {

        //StringTest();将字符串缓存到String结构中。
        //objectTest();将对象缓存到String数据结构中
        objectToJsonTest();//将对象缓转换为json字符串缓存到redis中。
    }

    /**
     * 将字符串缓存到String结构中。
     *  set一个值、mset多个值操作
     *
     */
    public static void StringTest() {
        jedis.set("user:001:name", "yefuhao");
        jedis.mset("user:002:name", "huge", "user:003:name", "yaoming");
        System.out.println(jedis.get("user:001:name"));
        System.out.println(jedis.get("user:002:name"));
        System.out.println(jedis.get("user:003:name"));

    }

    /**
     * 将对象缓存到String数据结构中。（该对象必须实现Serializable接口）
     *
     */
    public static void objectTest() throws Exception {
        ProduceInfo p = new ProduceInfo();
        p.setName("Iphone10");
        p.setPrice(8000.0);
        p.setProcuctDesc("看视频");

        // 将对象序列化为byte数组
        ByteArrayOutputStream ba = new ByteArrayOutputStream();//字节输出流
        ObjectOutputStream oos = new ObjectOutputStream(ba);//对象输出流。
        // 用对象序列化的方式将ProduceInfo序列化写入流中
        oos.writeObject(p);
        // 将ba字节输出流转换为字节数组
        byte[] pBytes = ba.toByteArray();
        // 将序列化好的数据缓存到redis中去。注意value是个字节数组，那么统一，key也要设置成字节数组.getBytes()
        jedis.set("product:001".getBytes(), pBytes);

        // 读取刚刚缓存的数据
        byte[] pBytesRes = jedis.get("product:001".getBytes());
        // 反序列化
        ByteArrayInputStream bi = new ByteArrayInputStream(pBytesRes);
        ObjectInputStream oi = new ObjectInputStream(bi);
        //!!!!!!!  readObject()抛异常坑！！
        ProduceInfo pRes = (ProduceInfo) oi.readObject(); //坑：！！！注意必须，抛出Exception异常，为不能抛出IOException

        System.out.println(pRes); //pRes相当于调用了pRes.toString()

    }

    /**
     * 将对象缓转换为json字符串缓存到redis中。
     *
     */
    public static void objectToJsonTest() {
        ProduceInfo p = new ProduceInfo();
        p.setName("苹果");
        p.setPrice(10.0);
        p.setProcuctDesc("真好吃");

        // 将对象转换成json格式
        Gson gson = new Gson();
        String jsonProductInfo = gson.toJson(p);

        // 将json格式数据缓存到redis
        jedis.set("product:002", jsonProductInfo);

        // 获取数据
        String jsonRes = jedis.get("product:002");

        // 将json字符串准换成对象
        ProduceInfo produceInfo = gson.fromJson(jsonRes, ProduceInfo.class);

        System.out.println(jsonRes);// json字符串：{"name":"苹果","price":10.0,"procuctDesc":"真好吃"}
        System.out.println(produceInfo);

    }

}
